import store from '@/store/index.js'

// 是否正在重新请求token
let isRequesting = false;
// 请求队列
let reqQuene = [];

// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		config.baseURL = 'https://test-shopping-back.bluej.cn/api'; /* 根域名 */
		config.timeout = 100000; // 超时时间
		return config
	})

	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => {
		if (!config.custom.hideLoading) {
			// 显示loading
			uni.showLoading({
				title: '加载中',
			})
		}


		if (config.custom.auth) {
			// 获取登录令牌
			let token = store.getters.token
			// 如果需要携带token
			config.header['x-token'] = token
		}

		return config
	}, config => {
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {
		const data = response.data


		if (!response.config.custom.hideLoading) {
			// 隐藏loading
			uni.hideLoading()
		}
		if (response.config.custom.toast) {
			// 需要提示
			uni.showToast({
				title: data?.msg || '操作成功',
				icon: 'success'
			})
		}

		return data
	}, (response) => {
		// 错误码
		let statusCode = response.statusCode;

		if (!response.config.custom.hideLoading) {
			// 隐藏loading
			uni.hideLoading()
		}
		if (response.config.custom.toast && statusCode != 401) {
			// 需要提示
			uni.showToast({
				title: '操作失败',
				icon: 'error'
			})
		}

		// 错误码为401表示登录令牌错误或者登录过期
		// 需要重新发起请求获取新的token
		if (statusCode === 401 && uni.getStorageSync('userInfo')) {
			// 获取原失败请求的配置信息
			let config = response.config;

			if (!isRequesting) {
				// 响应第一次失败的请求
				isRequesting = true;
				reqQuene = [];
				// 获取用户code
				return new Promise((resolve) => {
					uni.login({
						success: async (res) => {
							// 发起用户登录
							let data = await vm.$api.user.userLoginAPI(res.code);
							// 保存用户登录信息
							vm.$store.commit('SaveUserInfo', data.data);
							// 重新发起失败的请求
							let result = await uni.$u.http.request(config);
							resolve(result);
							// console.log(result);
							reqQuene.forEach(fn => fn());
							isRequesting = false;
						}
					})
				})
			} else {
				// 储存非第一次失败的请求，等token更新后再次发起请求
				return new Promise((resolve, reject) => {
					reqQuene.push(() => {
						resolve(uni.$u.http.request(config));
					});
				});
			}
		}

		return Promise.reject(response)
	})
}